     /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.prod.mbean;

import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.ArchivoMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.prod.dto.AreaDto;
import com.brain.prod.manager.AreaManager;
import java.io.Serializable;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 * @author Greip Company
 * @since 09/01/2014
 * @version 1.0
 */
@Controller("areaMBean")
@Scope("session")
public class AreaMBean extends GenericMBean implements Serializable {

    /**
     * Logger permite registrar los errores que ocurren
     * @since 09/01/2014
     */
    private static Logger logger = Logger.getLogger(AreaMBean.class);
    
    /**
     * AreaManager comunica a la vista con la capa de negocio
     * @since 09/01/2014
     */
    @Resource
    private AreaManager manager;      
    
    /**
     * applicationMBean permite obtener diferentes valores de la aplicación, como acciones y estilos
     * @since 09/01/2014
     */
    @Autowired
    private ApplicationMBean applicationMBean;
    
    /**
     * sessionMBean mantiene los datos del usuario en sesion, así como otros valores usados por la aplicación
     * @since 09/01/2014
     */
    @Autowired
    private SessionMBean sessionMBean;
    
    /**
     * recursosManager permite mostrar mensajes en las vistas
     * @since 09/01/2014
     */
    @Resource
    private RecursosManager recursosManager;
    
    /**
     * bitacoraManager comunica a la vista con la capa de negocio
     * @since 09/01/2014
     */
    @Resource
    private BitacoraManager bitacoraManager;   
    
    /**
     * archivoMBean
     * @since 09/01/2014
     */
    @Resource
    private ArchivoMBean archivoMBean;
    
    /**
     * Lista mantiene el listado de las entidades AreaDto
     * @since 09/01/2014
     */
    private List<AreaDto> lista;
    
    /**
     * dto entidad AreaDto utilizada para almacenar los datos provenientes de la vista listaArea.xhtml y area.xhtml
     * @since 09/01/2014
     */
    private AreaDto dto;
    
    /**
     * dtoFiltro entidad AreaDto utilizada para almacenar los filtros provenientes de la vista listaArea.xhtml
     * @since 09/01/2014
     */
    private AreaDto dtoFiltro;
    
    /**
     * keyTitulo construido a partir de las acciones realizadas, se muestra en las vistas como titulo de los paneles
     * @since 09/01/2014
     */
    private String keyTitulo = "form.area.panel";

    /**
     * Metodo iniciar() inicializa algunos campos de la entidad dtoFiltro y devuelve la dirección de la vista listaArea.xhtml
     * @since 09/01/2014
     * @return retorna la dirección de la vista listaArea.xhtml
     */
    public String iniciar() {
        this.dtoFiltro = new AreaDto();        
        this.dtoFiltro.setDescripcion("");
        this.dtoFiltro.setDescripcionCorta("");
        this.dtoFiltro.setEstado(Boolean.TRUE);
        this.lista = null;
        return this.manager.getUrlLista();
    }

    /**
     * Metodo buscar() realiza la busqueda de entidades AreaDto, haciendo uso del filtro dtoFiltro
     * @since 09/01/2014
     * @param ae por defecto null
     */
    public void buscar(ActionEvent ae) {
        try {
            this.lista = this.manager.obtenerArea(this.dtoFiltro);
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    /**
     * Metodo nuevo() se encarga de inicializar la entidad dto, indicar la acción a realizar (nuevo) y finalmente retornar la dirección de la vista area.xhtml
     * @since 09/01/2014
     * @return retorna la dirección de la vista area.xhtml
     */
    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.dto = this.manager.inicializar();
        return this.manager.getUrl();
    }

    /**
     * Metodo editar() se encarga de indicar la acción a realizar (editar), construye el titulo para la ventana y finalmente devuelve la dirección de la vista area.xhtml
     * @since 09/01/2014
     * @return retorna la dirección de la vista area.xhtml
     */
    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));        
        return this.manager.getUrl();
    }
    
    /**
     * Metodo ver() se encarga de indicar la acción a realizar (ver), construye el título para la ventana y finalmente devuelve la dirección de la vista area.xhtml
     * @since 09/01/2014
     * @return retorna la dirección de la vista area.xhtml
     */
    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        return this.manager.getUrl();
    }
    
    /**
     * Metodo guardar() se encarga de guardar la entidad AreaDto y devuelve null como valor de cadena
     * @since 09/01/2014
     * @return retorna null como valor de cadena
     */
    public String guardar() {        
        if (this.manager.guardar(this.dto) != null) {            
            this.editar();
        }        
        return null;
    }
    
    /**
     * Metodo verBitacora() muestra un historial con las acciones realizadas sobre un registro en específico
     * @since 09/01/2014
     * @return 
     */
    public String verBitacora() {
        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }
    
    /**
     * Metodo retroceder() realiza la búsqueda de las entidades AreaDto y retorna la dirección de la vista listaArea.xhtml para mostrar los registros encontrados
     * @since 09/01/2014
     * @return 
     */
    public String retroceder() {
        buscar(null);
        return this.manager.getUrlLista();
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public AreaDto getDto() {
        return dto;
    }

    public void setDto(AreaDto dto) {
        this.dto = dto;
    }

    public AreaDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(AreaDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public List<AreaDto> getLista() {
        return lista;
    }

    public void setLista(List<AreaDto> lista) {
        this.lista = lista;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        AreaMBean.logger = logger;
    }  

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }
    
    public ArchivoMBean getArchivoMBean() {
        return archivoMBean;
    }

    public void setArchivoMBean(ArchivoMBean archivoMBean) {
        this.archivoMBean = archivoMBean;
    }

    public AreaManager getManager() {
        return manager;
    }

    public void setManager(AreaManager manager) {
        this.manager = manager;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }
}
